package com.jsj.bs.controller;

import com.jsj.bs.pojo.Result;
import com.jsj.bs.pojo.TbLeader;
import com.jsj.bs.service.TbLeaderService;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.support.SessionStatus;

import javax.servlet.http.HttpSession;

/**
 * (TbLeader)表控制层
 * @author King_long
 * @since 2019-12-31 18:53:56
 */
@Controller
@RequestMapping("/tbLeader")
public class TbLeaderController {
    /**
     * log4j2日志管理
     */
    private static final Logger LOGGER = LogManager.getLogger(TbLeaderController.class);

    /**
     * 返回的结果集 自定义
     */
    private static final Result resultMsg = new Result();

    /**
     * 服务对象
     */
    @Autowired
    private TbLeaderService tbLeaderService;

    /**
     * 负责人管理 负责人登陆
     *
     * @param tbLeader 负责人实体对象
     * @return 指定页面
     */
    @RequestMapping("/login-leader")
    public String loginLeader(TbLeader tbLeader, HttpSession session, Model model) {
        String account = tbLeader.getLeaderAccount();
        String password = tbLeader.getLeaderPassword();
        LOGGER.error(tbLeader.getLeaderAccount() + "===============" + tbLeader.getLeaderPassword());
        //3、得到Subject及创建用户名/密码身份验证Token（即用户身份/凭证）
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(account, password);
        try {
            //4、登录，即身份验证
            subject.login(token);
            if (subject.isAuthenticated()) {
                Boolean status = tbLeaderService.queryStatus(account);
                Integer leaderId = tbLeaderService.queryByLId(account);
                LOGGER.info("+=================lid==============" + leaderId);
                if (!status && subject.hasRole("leader")) {
                    session.setAttribute("account", account);
                    session.setAttribute("leaderId", leaderId);
                    //start   此处是用来判断用户和负责人第一次修改密码成功的判断
                    session.setAttribute("status", 001);
                    session.setAttribute("msg", "修改完成，请重新登陆");
                    //end
                    session.setAttribute("hasRole", "hasLeader");
                    return "leaderpage";
                }else {
                    session.setAttribute("msg", "当前账户异常，请联系管理员" + status);
                    return "redirect:/error";
                }
            }
        } catch (AuthenticationException e) {
            //5、身份验证失败
            e.printStackTrace();
        }
        session.setAttribute("msg", "账户或密码错误");
        return "redirect:/error";
    }

    /**
     * 负责人管理 修改密码
     *
     * @param tbLeader  实体对象
     * @param session jsp内置对象
     * @param status
     * @return
     */
    @RequestMapping(value = "/upTbLeader", method = RequestMethod.POST)
    public String upTbUser(TbLeader tbLeader, HttpSession session, SessionStatus status) {
        LOGGER.info(tbLeader + "=======================controller  up===========");
        //获取账户密码
        String password = tbLeader.getLeaderPassword();
        //使用MD5加密 第一个参数--加密的字符串  第二个参数---盐值  第三个参数---加盐次数 即散列次数
        password = new Md5Hash(password, tbLeader.getLeaderAccount(), 1024).toString();
        //将加密后的密码添加到TbAdmin实体对象中
        tbLeader.setLeaderPassword(password);
        //更新数据
        TbLeader leader = tbLeaderService.update(tbLeader);
        //判断是否更新成功
        if (leader != null) {
            session.setAttribute("status", 1);
            session.setAttribute("msg", "修改完成，请重新登陆");
            return "redirect:/login-leader";
        }
        session.setAttribute("msg", "修改失败，请联系管理员");
        return "redirect:/error";
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @RequestMapping("/selectOne")
    @ResponseBody
    public TbLeader selectOne(Integer id) {
        return tbLeaderService.queryById(id);
    }


    /**
     * 管理员管理 查询所有用户信息
     *
     * @param page 页码
     * @param pageSize 页面大小
     * @param tbLeader 负责人实体对象
     * @param model 存储数据的容器
     * @return
     */
    @RequestMapping(value = "/searchLeader", method = RequestMethod.GET)
    public String search(@RequestParam(value = "page", defaultValue = "1") Integer page,
                         @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
                         TbLeader tbLeader, Model model) {
        //将获取的数据存到model，以便jsp页面获取
        model.addAttribute("leaderlist", tbLeaderService.queryAll(page, pageSize, tbLeader));
        return "leader-manager";
    }


    /**
     * 管理员管理 模糊查询
     *
     * @param fuzzy 查询信息
     * @param model 存储信息的容器
     * @return 指定页面
     */
    @RequestMapping(value = "/fuzzy", method = RequestMethod.POST)
    public String searchFuzzy(String fuzzy, Model model) {
        model.addAttribute("leaderlist", tbLeaderService.searchFuzzy(1, 5, fuzzy));
        return "leader-manager";
    }

    /**
     * 管理员管理 更新用户状态
     *
     * @param tbLeader 负责人实体对象
     * @return 结果集（响应信息和相应标识）
     */
    @RequestMapping(value = "/updateStatus", method = RequestMethod.POST)
    @ResponseBody
    public Result updateStatus(TbLeader tbLeader) {
        LOGGER.info("=======/tbLeader/updateStatus======" + tbLeader.getLeaderId());
        Boolean result = tbLeaderService.updateOk(tbLeader);
        if (result) {
            resultMsg.setFlag(true);
            resultMsg.setMsg("操作成功");
        } else {
            resultMsg.setFlag(false);
            resultMsg.setMsg("操作失败");
        }
        return resultMsg;
    }

    /**
     * 管理员管理 添加维修负责人
     *
     * @param tbLeader 负责人实体对象
     * @param session  jsp的内置对象 服务端存储数据的对象  30分钟内有效
     * @return 指定页面
     */
    @RequestMapping(value = "addLeader", method = RequestMethod.POST)
    public String addLeader(TbLeader tbLeader, HttpSession session,Model model) {
        LOGGER.info("======添加的用户是====="+tbLeader);
        TbLeader query = tbLeaderService.queryByLeaderAccount(tbLeader.getLeaderAccount());
        LOGGER.info("======添加的用户是否存在====="+query);
        if (query == null) {
            //添加用户角色
           tbLeader.setRoleId(2);
            //获取账户密码
            String password = tbLeader.getLeaderPassword();
            //使用MD5加密 第一个参数--加密的字符串  第二个参数---盐值  第三个参数---加盐次数 即散列次数
            password = new Md5Hash(password, tbLeader.getLeaderAccount(), 1024).toString();
            //将加密后的密码添加到TbAdmin实体对象中
            tbLeader.setLeaderPassword(password);
            //不存在，可以添加
            TbLeader leader = tbLeaderService.insert(tbLeader);
            //返回 1 成功  0 失败
            model.addAttribute("addLeaderStatus", 1);
            model.addAttribute("leaderlist", tbLeaderService.queryAll(1, 5, new TbLeader()));
            return "leader-manager";
        }else {
            model.addAttribute("addLeaderStatus2", 0);
            return "addleader-page";
        }
    }
}